package com.cdzs.twocamera.keeplive;

import android.annotation.TargetApi;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.os.Build;

/**
 * Created by M_genius on 2018/8/7.
 * 描述:
 * 1、它允许 APP 在将来达到一定条件时执行指定的任务
 * 2、只能在 Android 5.0 及以上才能使用
 * 3、对于Android 5.0，JobSheduler 的唤醒是非常有效的；
 * 4、对于Android 6.0，虽然谷歌引入了Doze 模式，但通常很难真正进入Doze 模式，所以JobSheduler 的唤醒依然有效；
 * 5、对于Android 7.0，JobSheduler 的唤醒会有一定的影响，我们可以在电池管理中给 APP 开绿色通道，防止手机 Doze 模式后阻止 APP 使用 JobSheduler 功能
 */

public class JobSchedulerManager {

    private static final int JOB_ID = 1;
    private static JobSchedulerManager mJobManager;
    private JobScheduler mJobScheduler;
    private static Context mContext;

    private JobSchedulerManager(Context ctxt) {
        this.mContext = ctxt;
        mJobScheduler = (JobScheduler) ctxt.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    }

    public final static JobSchedulerManager getJobSchedulerInstance(Context ctxt) {
        if (mJobManager == null) {
            mJobManager = new JobSchedulerManager(ctxt);
        }
        return mJobManager;
    }

    @TargetApi(21)
    public void startJobScheduler() {

        // 如果 JobService 已经启动或 API < 21，返回
        if (AliveJobService.isJobServiceAlive() || isBelowLOLLIPOP()) {
            return;
        }
        // 构建JobInfo对象，传递给 JobSchedulerService
        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(mContext, AliveJobService.class));

        // 设置每3秒执行一下任务
        builder.setPeriodic(3000);
        // 设置设备重启时，执行该任务
        builder.setPersisted(true);
        // 当插入充电器，执行该任务
        builder.setRequiresCharging(true);

        JobInfo info = builder.build();
        //开始定时执行该系统任务
        mJobScheduler.schedule(info);
    }

    @TargetApi(21)
    public void stopJobScheduler() {
        if (isBelowLOLLIPOP())
            return;
        mJobScheduler.cancelAll();
    }

    private boolean isBelowLOLLIPOP() {
        // API< 21
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
    }
}
